/*
 * @Author: your name
 * @Date: 2021-12-26 17:24:38
 * @LastEditTime: 2021-12-26 19:49:57
 * @LastEditors: Please set LastEditors
 * @Description: 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
 * @FilePath: /flutter-learning/Dart_Basic_Grammer/class_object.dart
 */

// 调用 Animal class
import './lib/Animal.dart';

/**
 * 一个类：属性 + 方法
 */

// 类名字首字母大写
class Person {
  // 属性
  String name = "";
  int age = 20;

  // 静态属性
  static int nn = 0;

  // 私有属性
  int _a = 0;

  // 构造函数
    // 只要执行了 class，那么构造函数会被自动执行
    // 构造函数可以写多个
  
  // 默认构造函数
  Person(String name, int age) {
    this.name = name;
    this.age = age;
    print('构造函数中的内容，实例化的时候触发');
  } // 可以简写为：Person(this.name, this.age);

  // 命名构造函数
  Person.now() {
    print("I am 命名构造函数");
  }

  // 方法
  void getInfo() {
    // print("$name---$age");
    print("${this.name}------${this.age}");
  } 
  void setInfo(int age) {
    this.age = age;
  }

  // 获取私有变量
  int getA() {
    return this._a;
  }

  
  /**
   * 静态属性和静态方法：
   *    1. 使用 static 关键字来实现类级别的变量和函数
   *    2. 静态方法不能访问非静态成员，非静态方法可以访问静态成员
   *    3. 静态方法 不需要实例化便可以访问
   *    4. 建议使用 this.variable 访问非静态变量
   *    5. 直接使用 variable 变量名访问静态变量
   */
  static show() {
    print(nn);
  }
}

/** 
   * 面向对象：封装，继承，多态
   * 
   * Dart中的继承
   *    1. 子类使用 extends 关键词继承父类
   *    2. 子类会继承父类里边可见的属性和方法，但是不会继承构造函数
   *    3. 子类能复写父类的方法 getter 和 setter
  */
  class W {
    String name = "Simon";
    int age = 20;

    W(this.name, this.age);

    void prinInfo() {
      print("${this.name}----${this.age}");
    }

    void work() {
      print("${this.name} is working...");
    }
  }

  class Web extends W {
    String sex = "";
    Web(String name, int age, String sex) : super(name, age) {
      this.sex = sex;
    }

    run() {
      print("${this.name}---${this.age}---${this.sex}");
    }

    // Overwrite 父类方法
    @override
    void work() {
      print("${this.age}");
    }
    
  }

void main(List<String> args) {
  // 实例化
  var p1 = new Person("Simon", 20);
  Person p2 = new Person("Neal", 21); // 默认调用的是默认构造函数
  // 调用命名构造函数
  Person p3 = new Person.now();
  print(p1.name);
  print(p1.age);
  p1.getInfo();
  p2.setInfo(23);
  p2.getInfo();

  // 使用静态方法
  Person.show();    // 静态方法不能使用 new 来使用

  // 调用 Animal
  Animal a1 = new Animal("Alex", 22);
  Animal a2 = new Animal.setInfo("AA", 21);
  a2.printInfo();
  a1.printInfo();
  
  

  // 继承
  print("继承");
  Web w = new Web("Siiii", 12, "famale");
  w.prinInfo();
  w.run();
  w.work();

}

/**
 * 将 class 抽离成为一个单独的文件
 * 在根目录下建立 lib/Animal.dart
 */